package com.itheima.service.impl;

import com.itheima.dao.OrderSettingDao;
import com.itheima.pojo.OrderSetting;
import com.itheima.service.OrderSettingService;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.*;

@Service
@Transactional
public class OrderSettingServiceImpl implements OrderSettingService {

    //本地注入dao
    @Autowired
    private OrderSettingDao orderSettingDao;

    /**
     * 解析预约的信息
     *
     * @param list 所有的预约信息集合
     * @return
     */
    @Override
    public void add(List<OrderSetting> list) {


        //判断集合是否为空
        if (list != null && list.size() > 0) {
            //使用循环的方法，调用dao的接口，将数据写到磁盘
            for (OrderSetting orderSetting : list) {

                //拿到这里面的日期去查，数据库有没有这条数据，有的话就修改，没有的话，就查询
                Date orderDate = orderSetting.getOrderDate();

                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                String date = sdf.format(orderDate);
                //调用查询方法
                Long count = orderSettingDao.findCountByOrderDate(date);

                //判断查询的数量，看一下数据库里面有没有这条数据
                if (count > 0) {
                    //有数据，调用修改的方法
                    // FIXME: 2020/10/15   此处报错   问题已解决  解决方案 传入的日期值换成了字符串格式
                    //  update t_ordersetting         set number=?         where orderDate=?
                    //### Cause: java.sql.SQLException: Data truncated for column 'number' at row 25
                    //; ]; Data truncated for column 'number' at row 25; nested exception is java.sql.SQLException:
                    // Data truncated for column 'number' at row 25
                    int number = orderSetting.getNumber();
                    //有数据，调用修改的方法
                    orderSettingDao.editNumberByOrderDate(number,date);
                } else {
                    //没有这个日期，就添加
                    orderSettingDao.add(orderSetting);
                }
            }
        }
    }

    /**
     * 根据月份获取相应的数据
     *
     * @param date 年和月
     * @return 封装所有数据的集合
     */
    @Override
    public List<Map> getOrderSettingByMonth(String date) {
        //拼接本月的第一天
        String begin = date + "-1";
        //拼接本月的最后一天
        String end = date + "-31";
        //将这两个数据传给dao，查询数据库
        // 封装到map；里面
        Map<String, String> map = new HashMap<>();
        map.put("begin", begin);
        map.put("end", end);
        //调用方法 返回的是多个预约设置
        List<OrderSetting> list = orderSettingDao.getOrderSettingByMonth(map);
        //返回值需要一个集合，参数为map，转成map参数，和前端需要的参数一一对应
        List<Map> result = new ArrayList<>();
        //遍历集合，获取每一个参数，一个一个的转
        if (list != null && list.size() > 0) {

            for (OrderSetting orderSetting : list) {
                //将数据放进去   注意  前端获取的方式是键值对，所以要将所有的数据封装成键值对的样式
                Map<String, Object> temp = new HashMap<>();
                temp.put("date", orderSetting.getOrderDate().getDate());   //设置的值是日期
                temp.put("number", orderSetting.getNumber());   //当天的可预约人数
                temp.put("reservations", orderSetting.getReservations());   //当天的已预约人数
                //将数据放到集合里面
                result.add(temp);
            }
        }
        return result;
    }

    /**
     * 修改预约数据
     *
     * @param orderSetting 预约数据
     * @return 封装所有数据的集合
     */
    @Override
    public void editNumberByDate(OrderSetting orderSetting) {

        //拿到这里面的日期去查，数据库有没有这条数据，有的话就修改，没有的话，就添加
        Date orderDate = orderSetting.getOrderDate();
        //todo 试一下转换格式  格式转化之前报错  格式转成了字符串之后成功
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String date = sdf.format(orderDate);
        //调用查询方法
        Long count = orderSettingDao.findCountByOrderDate(date);

        // FIXME: 2020/10/16  需要格式转换吗？ 传入的日期值  Wed Oct 21 08:00:00 CST 2020   数据库有2020-10-21  为什么查出来的值是次数是0

        //判断查询的数量，看一下数据库里面有没有这条数据
        if (count > 0) {
            int number = orderSetting.getNumber();
            //有数据，调用修改的方法
            orderSettingDao.editNumberByOrderDate(number,date);
        } else {
            //没有这个日期，就添加
            orderSettingDao.add(orderSetting);
        }
    }
}
